package com.wyg.lambda.streamapi.thread;

import java.util.stream.Stream;

/**
 * Stream API Demo
 *
 * 三、Stream线程 并行流 和 串行流
 *
 *  1.并行流-多线程工作  parallel()
 *  2.串行流-单线程工作  sequential()
 *
 * @ClassName: StreamThread
 * @Description: TODO
 * @Auther: WangYG
 * @Date: 2020-02-23 01:38:47
 * @Version: 1.0
 */
public class StreamThread {

    /**
     * 功能描述: StreamAPI - 演示多线程-并行执行
     * <P>
     *
     *     启用多线程-并发执行 Stream.parallel()
     *
     * </P>
     * @methodName: one
     * @params: []
     * @return: void
     * @exception:
     * @auther: WangYG
     * @date: 2020-02-23 01:46:13
     */
    public void one(){

        //演示多线程-并行执行
        // 启用多线程-并发执行 Stream.parallel()

        //模拟200个元素
        Integer max = Stream.iterate(1, x -> x+1).limit(200)
                //启用多线程-并发执行
                .parallel()
                //中间输出线程名称
                .peek(x -> System.out.println(Thread.currentThread().getName()))
                //获取最大数值
                .max(Integer::compare).get();
        System.out.println(max);

    }

    /**
     * 功能描述: StreamAPI - 演单线程-串行执行
     * <P>
     *
     *     启用单线程-串行执行 Stream.sequential()
     *
     * </P>
     * @methodName: two
     * @params: []
     * @return: void
     * @exception:
     * @auther: WangYG
     * @date: 2020-02-23 01:50:51
     */
    public void two(){

        //演示单线程-串行执行
        // 启用单线程-串行执行 Stream.sequential()

        //模拟200个元素
        Integer max = Stream.iterate(1, x -> x + 1).limit(200)
                //为了查看效果：先启用多线程并发，再设置为sequential()串行执行体现效果
                .parallel().sequential()
                //中间输出线程名称
                .peek(x -> System.out.println(Thread.currentThread().getName()))
                //获取最大数值
                .max(Integer::compare).get();
        System.out.println(max);
    }

    /**
     * 功能描述: StreamAPI - 演示 设置多线程数-并发数量设置
     *
     * <P>
     *     StreamAPI中线程池使用的是：ForkJoinPool
     *          设置后会发现执行线程数的变化
     *
     *     1.启动参数中设置：-Djava.util.concurrent.ForkJoinPool.common.parallelism=5
     *
     *     2.启动代码中设置：System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism","6");
     *
     * </P>
     * @methodName: three
     * @params: []
     * @return: void
     * @exception:
     * @auther: WangYG
     * @date: 2020-02-23 01:57:20
     */
    public void three(){

        // 演示设置 多线程数-并发数量设置
        // 启用多线程-并发执行 Stream.parallel()

        //设置线程数，会发现执行线程的变化，实际开发中根据CPU核数设置
        //设置启动参数 -Djava.util.concurrent.ForkJoinPool.common.parallelism=5
        System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism","6");

        //模拟200个元素
        Integer max = Stream.iterate(1, x -> x+1).limit(200)
                //启用多线程-并发执行
                .parallel()
                //中间输出线程名称
                .peek(x -> System.out.println(Thread.currentThread().getName()))
                //获取最大数值
                .max(Integer::compare).get();
        System.out.println(max);

    }

}
